本章我們來寫個不太實用,但是也不怎麼困難的小東西,結合之前寫過的小程式,我們很輕鬆就可以做到。
import dlib
import cv2
import imutils
cap = cv2.VideoCapture(0)
detector = dlib.get_frontal_face_detector()
宣告完cap
和detector
,我們和上章一樣要寫一個迴圈,只是迴圈內部的內容會做些小變動:
while(cap.isOpened()):
ret, frame = cap.read()
# 將frame轉成灰階圖
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
face_rects = detector.run(gray, 0)
for i, d in enumerate(face_rects):
x1 = d.left()
y1 = d.top()
x2 = d.right()
y2 = d.bottom()
cv2.rectangle(gray, (x1, y1), (x2, y2), (0, 0, 255), 10, cv2.LINE_AA)
result = gray[y1:y2, x1:x2]
cv2.imshow("FaceShow",result)
# 圖片存檔判斷式
if cv2.waitKey(1) & 0xFF == ord('s'):
cv2.imwrite('output.jpg', result)
elif cv2.waitKey(1) & 0xFF == ord('q'):
break
可以看到我們用cv2.cvtColor
函式將攝像頭擷取到的原始圖片轉成了灰階圖片,然後將灰階圖片丟進人臉偵測器裡,而且我們進行分割的圖片是畫了矩形的灰階圖片,所以我們執行cv2.imshow
印出來的結果會是一張灰階帶深色框的大頭照,同時進行動態人臉捕捉。
因為要做拍攝功能,所以在break
條件的上方多加了一條判斷式:當迴圈執行途中偵測到s
按鍵輸入,就會執行cv2.imwrite
進行圖片存檔,達到可即時截圖的功能。
寫完上面的迴圈,別忘了在程式跳出之後節省記憶體:
cap.release()
cv2.destroyAllWindows()